package generator;

import java.util.*;

import util.MieszkanieEnum;
import util.PlecEnum;
import util.StanCywilnyEnum;
import util.WojewodztwoEnum;
import util.WyksztalcenieEnum;
import util.ZawodEnum;
import klient.Klient;

public class GeneratorKlientow {

	static Map<String, WojewodztwoEnum> miasta = new HashMap<String, WojewodztwoEnum>();
	static String[] imionaM = new String[] { "Marcin", "Pawel", "Krzysztof",
			"Edward", "Andrzej", "Artur", "Waldemar" };
	static String[] imionaZ = new String[] { "Mariola", "Ewa", "Paulina",
			"Katarzyna", "Miroslawa", "Aneta", "Anna" };
	static String[] samogloski = new String[] { "a", "e", "i", "o", "u" };
	static String[] spolgloski = new String[] { "b", "c", "d", "f", "g", "h",
			"j", "k", "l", "m", "n", "p", "r", "s", "t", "w", "z" };

	static {
		utworzMiasta();
	}

	private static void utworzMiasta() {
		miasta.put("Warszawa", WojewodztwoEnum.W);
		miasta.put("Torun", WojewodztwoEnum.C);
		miasta.put("Gdansk", WojewodztwoEnum.G);
		miasta.put("Lodz", WojewodztwoEnum.E);
		miasta.put("Krakow", WojewodztwoEnum.K);
		miasta.put("Opole", WojewodztwoEnum.O);
		miasta.put("Katowice", WojewodztwoEnum.S);
		miasta.put("Lublin", WojewodztwoEnum.L);
		miasta.put("Bialystok", WojewodztwoEnum.B);
		miasta.put("Szczecin", WojewodztwoEnum.Z);
		miasta.put("Wroclaw", WojewodztwoEnum.D);
		miasta.put("Kielce", WojewodztwoEnum.T);
		miasta.put("Rzeszow", WojewodztwoEnum.R);
		miasta.put("Poznan", WojewodztwoEnum.P);
		miasta.put("Olsztyn", WojewodztwoEnum.N);
		miasta.put("Zielona gora", WojewodztwoEnum.F);
	}

	public static Klient generujKlienta() {

		Random r = new Random();
		int losujSex = r.nextInt(2);

		final Klient nowyKlient;

		PlecEnum s;
		if (losujSex == 1)
			nowyKlient = generujMezczyzne();
		else
			nowyKlient = generujKobiete();

		przypiszMiasto(nowyKlient);
		przypiszDateUrodzenia(nowyKlient);
		przypiszEmail(nowyKlient);
		przypiszStanCywilny(nowyKlient);
		przypiszLiczbeDzieci(nowyKlient);
		przypiszZawodiWyksztalcenie(nowyKlient);
		przypiszDochod(nowyKlient);
		przypiszMieszkanie(nowyKlient);
		przypiszOszczednosci(nowyKlient);

		return nowyKlient;

	}

	private static Klient generujMezczyzne() {

		Random r = new Random();

		String imie = imionaM[r.nextInt(imionaM.length)];

		String nazwisko = generujNazwisko(PlecEnum.M);

		Klient nowy = new Klient(imie, nazwisko);
		nowy.setPlec(PlecEnum.M);

		return nowy;

	}

	private static Klient generujKobiete() {

		Random r = new Random();

		String imie = imionaZ[r.nextInt(imionaZ.length)];

		String nazwisko = generujNazwisko(PlecEnum.K);

		Klient nowy = new Klient(imie, nazwisko);
		nowy.setPlec(PlecEnum.K);

		return nowy;

	}

	private static void przypiszMiasto(Klient k) {

		Random r = new Random();

		final Set zbiorMiast = miasta.keySet();
		final String wylosowaneMiasto = (String) zbiorMiast.toArray()[r
				.nextInt(miasta.size())];

		k.setMiasto(wylosowaneMiasto);
		k.setWojewodztwo(miasta.get(wylosowaneMiasto));

	}

	private static void przypiszEmail(Klient k) {

		String i = k.getImie().toLowerCase();
		String n = k.getNazwisko().toLowerCase();

		final String email = i + "." + n + "@gmail.com";

		k.setEmail(email);

	}

	private static void przypiszDateUrodzenia(Klient k) {

		Calendar ur = Calendar.getInstance();

		Random r = new Random();

		ur.set(Calendar.DAY_OF_MONTH, r.nextInt(28) + 1);
		ur.set(Calendar.MONTH, r.nextInt(12) + 1);
		ur.set(Calendar.YEAR, r.nextInt(50) + 1940);

		Date urr = new Date();

		urr.setTime(ur.getTimeInMillis());

		k.setDataUrodzenia(urr);

	}

	private static void przypiszStanCywilny(Klient k) {

		// 30% - SINGIEL, 65% - MALZONEK, 5%- WDOWIEC
		Double procent = new Random().nextDouble();

		if(procent <= 0.3) k.setStanCywilny(StanCywilnyEnum.S);
		else if(procent <= 0.95) k.setStanCywilny(StanCywilnyEnum.M);
		else k.setStanCywilny(StanCywilnyEnum.W);
		

	}

	private static void przypiszLiczbeDzieci(Klient k) {

		Double procent = new Random().nextDouble();

		// Jezeli singiel to 90% zero dzieci
		if (k.getStanCywilny() == StanCywilnyEnum.S) {
			if (procent <= 0.9)
				k.setLiczbaDzieci(0);
			else
				k.setLiczbaDzieci(1);
		} else { //JEZELI MALZONEK
			// 20% - zero 40% jedno dziecko, 30% - dwojka, 10% trojka
			if (procent <= 0.2)
				k.setLiczbaDzieci(0);
			else if (procent <= 0.6)
				k.setLiczbaDzieci(1);
			else if (procent <= 0.9)
				k.setLiczbaDzieci(2);
			else
				k.setLiczbaDzieci(3);
		}

	}

	private static void przypiszZawodiWyksztalcenie(Klient k) {

		// rozklad 10% podstawowe 40% zawodowe 30%srednie 20%wyzsze

		Double procentWykszt = new Random().nextDouble();

		WyksztalcenieEnum wyksztalcenie;

		if (procentWykszt <= 0.1)
			wyksztalcenie = WyksztalcenieEnum.P;
		else if (procentWykszt <= 0.5)
			wyksztalcenie = WyksztalcenieEnum.Z;
		else if (procentWykszt <= 0.8)
			wyksztalcenie = WyksztalcenieEnum.S;
		else
			wyksztalcenie = WyksztalcenieEnum.W;

		// przypisujemy wyksztalcenie
		k.setWyksztalcenie(wyksztalcenie);

		// patrzymy jakie zaowyd moze wykonywac
		ZawodEnum[] zawody = ZawodEnum.values();

		List<ZawodEnum> zgodneZawody = new ArrayList<ZawodEnum>();

		for (ZawodEnum z : zawody) {
			if (z.getWyksztalcenie() == wyksztalcenie)
				zgodneZawody.add(z);
		}

		// Losujemy zawod
		Random r = new Random();
		ZawodEnum wylosowanyZawod = zgodneZawody.get(r.nextInt(zgodneZawody
				.size()));

		// przypisujemy zawod
		k.setZawod(wylosowanyZawod);
	}

	private static void przypiszDochod(Klient k) {

		final int minDochod = k.getZawod().getPensjaMin();
		final int maxDochod = k.getZawod().getPensjaMax();

		int dochod = (int) ((double) maxDochod * new Random().nextDouble())
				+ minDochod;

		// przypisanie dochodu
		k.setDochod(dochod);

	}

	private static void przypiszMieszkanie(Klient k) {

		if (k.getDochod() > 15000) {
			k.setMieszkanie(MieszkanieEnum.WLAS);
		} else {
			Random r = new Random();

			MieszkanieEnum[] enumy = MieszkanieEnum.values();

			MieszkanieEnum m = enumy[r.nextInt(enumy.length)];

			k.setMieszkanie(m);
		}

	}

	private static void przypiszOszczednosci(Klient k) {
		k.setOszczednosciMsc((int) (k.getDochod() * new Random().nextDouble()));
	}

	private static String generujNazwisko(PlecEnum s) {

		// TODO: losowanie ski, i ska
		Random r = new Random();

		String koncowka = "";

		// Losowanie koncowki
		boolean b = r.nextBoolean();

		switch (s) {
		case M:
			if (b)
				koncowka = "cki";
			else
				koncowka = "ski";
			break;
		case K:
			if (b)
				koncowka = "cka";
			else
				koncowka = "ska";
			break;
		default:
			new RuntimeException("nie ma plci");
		}

		String l1, l2, l3, l4 = "", l5 = "";

		l1 = samogloski[r.nextInt(samogloski.length)].toUpperCase();
		l2 = spolgloski[r.nextInt(spolgloski.length)];
		l3 = samogloski[r.nextInt(samogloski.length)];

		boolean dluzszeNaz = r.nextBoolean();

		if (dluzszeNaz) {
			l4 = spolgloski[r.nextInt(spolgloski.length)];
			l5 = samogloski[r.nextInt(samogloski.length)];
		}

		String n = l1 + l2 + l3 + l4 + l5 + koncowka;

		return n;
	}

	public static void main(String[] args) {

		for (int i = 0; i < 100000; i++) {
			System.out.println(GeneratorKlientow.generujKlienta());

		}

	}

}
